package org.zjx.algorithm;


import org.zjx.core.RouteGraph;
import org.zjx.entity.Location;
import org.zjx.model.route.Route;

import java.util.List;

/**
 * 路径查找策略接口
 * 定义不同寻路算法的统一接口
 */
public interface PathFindingStrategy {

    /**
     * 查找最优路径
     * @param graph 路由图（非null）
     * @param start 起点（非null）
     * @param end 终点（非null）
     * @return 路径列表（按顺序），null表示不可达
     * @throws IllegalArgumentException 如果参数不合法
     */
    List<Route> findPath(RouteGraph graph, Location start, Location end);

    /**
     * 查找不超过最大耗时的路径
     * @param graph 路由图（非null）
     * @param start 起点（非null）
     * @param end 终点（非null）
     * @param maxTime 最大耗时（秒，必须>0）
     * @return 符合条件的路径，null表示无解
     */
    default List<Route> findPathWithinTime(RouteGraph graph,
                                           Location start,
                                           Location end,
                                           int maxTime) {
        if (maxTime <= 0) {
            throw new IllegalArgumentException("最大耗时必须为正数");
        }
        List<Route> path = findPath(graph, start, end);
        return path != null && getTotalTime(path) <= maxTime ? path : null;
    }

    /**
     * 计算路径总耗时
     * @param path 路径列表（非null）
     * @return 总耗时（秒）
     */
    static int getTotalTime(List<Route> path) {
        return path.stream().mapToInt(Route::getTime).sum();
    }
}